home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
tools
/
ask
/
askcodes
/
source
/
askcodes.s
< prev
Wrap
Text File
|
1999-08-31
|
38KB
|
1,609 lines
*******************************************************************************
* ASK3/codeAアクセサリ ASKCodes V1.31
* Copyright 1998-99 by AIG-Soft
*******************************************************************************
.include defines.mac
.include pspdef.mac
.include ask3.mac
.include skey.mac
.cpu 68000
TimerC equ $45 * Timer-CのベクターNo
EX68 equ 0 * EX68で動作可能にするかどうか(1=不可)
*******************************************************************************
* 常駐ルーチン
*******************************************************************************
* 1998をわざわざテキストでなしにバイナリー化しているのは、テキストのみより
* 誤った一致をしにくいから
.text
.even
KEEP_START:
* 常駐確認用識別子
id: .dc.b 'ASKCodes V1.31',19,99,'AIG-Soft',0
*******************************************************************************
* ワーク1
*******************************************************************************
* このワークエリアは起動時に初期値が必要/初期化時に利用するものである。
*
.even
ACh .dc.l -1 * アクセサリアドレス(初期値-1<0)
* 正常登録された時、ACh>=0になる(0,1,2,3...)
cd .dc.w JISKTOP * 参照中コード
ctop0 .dc.w $ffff * 現在ページトップコード
plane0 .dc.l 0 * 画面退避バッファーアドレス plane0用
plane1 .dc.l 0 * 画面退避バッファーアドレス plane1用
vecTimerC0 .dc.l 0 * 組み込み時のTimer-Cベクターのアドレス
first .dc.b 1 * 最初と最後の印(0,1,2)
ftimerc .dc.b $00 * =0:止めない , !=0:止める
*******************************************************************************
* メッセージ
*******************************************************************************
Sep .dc.b ' :',0
None .dc.b '**',0
MesTitle .dc.b '文字選択',0
Hyou .dc.b '[ 文字コード表 ]',0
* ScaleとKeysは同じ幅にすること
Scale .dc.b ' -code-:-+0-+1-+2-+3-+4-+5-+6-+7-+8-+9-+A-+B-+C-+D-+E-+F- ',0
Keys .dc.b ' [↑↓←→,RollUp/Down:移動,SPC:選択,BS/CLR:修正,CR:決定] ',0
* 文字種類メッセージ
LenType equ 10 * メッセージ長
* 123456789 10 幅は全て揃えること(長さを変えたら上の10も変える)
TypeHan .dc.b '半角文字 ',0
TypeHalf .dc.b '1/2角文字',0
TypeZen .dc.b '全角記号 ',0
Type1 .dc.b '第1水準 ',0
Type12 .dc.b '第1/2水準',0
Type2 .dc.b '第2水準 ',0
TypeZG .dc.b '全角外字 ',0
TypeU4 .dc.b '1/4角上付',0
TypeL4 .dc.b '1/4角下付',0
TypeHG .dc.b '半角外字 ',0
WShurui .dc.b '< : / >',0 * コード種類表示枠
* < :SJIS/JIS > * セパレーター'/'は毎回表示する
* 012345678901234567890
* 1 2
.even
*******************************************************************************
* 定数定義
*******************************************************************************
SCLEN equ 58 * Scaleの表示長さ=(sizeof(Scale)-1)
CDWX equ (SCLEN+2) * x幅(枠分を含む)
CDWY equ (12+2+1+1+1) * y幅:12行+上下SCALE+タイトル+キー操作+下枠
* 半角文字
HANTOP equ $0020
HANEND equ $00df
* 1/2角文字
HAN2TOP equ $8020
HAN2END equ $80df
* 記号
JISKTOP equ $8140
JISKEND equ $84be
* $85xx,$86xx,$87xxブロックはサポートしない
* JIS第1水準は連続だからいいけど、
JIS1TOP equ $889f * JIS第1水準漢字先頭
JIS1END equ $9872 * JIS第1水準漢字最終
* JIS第2水準は不連続だから困る
JIS2TOP1 equ $989f * JIS第2水準漢字第1ブロック先頭
JIS2END1 equ $9ffc * JIS第2水準漢字第1ブロック最終
JIS2TOP2 equ $e040 * JIS第2水準漢字第2ブロック先頭
JIS2END2 equ $eaa2 * JIS第2水準漢字第2ブロック最終
* 全角外字
JISGTOP equ $eb9f
JISGEND equ $ecfc
* 1/4角文字
HAN4TOP1 equ $f020 * 上付き
HAN4END1 equ $f1df
HAN4TOP2 equ $f220 * 下付き
HAN4END2 equ $f4df
* 半角外字
HANGTOP equ $f420
HANGEND equ $f5df
*******************************************************************************
* サブルーチン
*******************************************************************************
BREAKOFF:
* d0のみ破壊
move.w #-1,-(sp) * read BREAK mode
DOS _BREAKCK
move.w d0,brksts
clr.w -(sp) * BREAK Cut
DOS _BREAKCK
addq.w #2*2,sp
rts
* BREAKOFFは下にある
*------------------------------------------------------------------------------
isHankaku macro lbl
* 入力:d7.w:文字コード , lbl=半角時の処理アドレス
cmp.w #JISKTOP-1,d7
bcs lbl * <$813f:EndCode($823f-$100)で誤動作させないためJISKTOPにしない
cmp.w #JISGEND,d7
bhi lbl * >JISGEND
.endm
*------------------------------------------------------------------------------
AndIf macro top,end
* 入力:d7.w:文字コード
* c>top && c<end ; end>topのこと
local L1
cmp.w #top,d7
bls L1 * c<=top
* c>top
cmp.w #end,d7
bcs 1f * c<end = c>top && c<end
L1:
.endm
*---------------------------------------
NoneCode:
* コードが存在しないところかどうかを調べる
* 入力:d7.w=コード
* 出力:d0.l: =0:存在する , <>0:存在しない
* 破壊:d0
moveq.l #1,d0 * return(1)のため
cmp.w #HANTOP,d7
bcs 1f * code<HANTOP
cmp.w #HANGEND,d7
bhi 1f * code>HANGEND
*
AndIf HANEND,HAN2TOP
AndIf HAN2END,JISKTOP
AndIf JISKEND,JIS1TOP
AndIf JIS1END,JIS2TOP1
AndIf JIS2END1,JIS2TOP2
AndIf JIS2END2,JISGTOP
AndIf JISGEND,HAN4TOP1
*
isHankaku 2f * 半角?
* 全角系
cmp.b #$40,d7
bcs 1f * <$40
cmp.b #$7f,d7
beq 1f * =$7f
cmp.b #$fc,d7
bhi 1f * >$fc
bra 10f * return(0)
*
2: * 半角
cmp.b #$20,d7
bcs 1f * <$20
cmp.b #$e0,d7
bcc 1f * >=$e0
cmp.b #$7f,d7
bcs 10f * <$7f ... return(0)
cmp.b #$9f,d7
bls 1f * <=$9f
10: moveq.l #0,d0 * return(0)
1: rts
*------------------------------------------------------------------------------
TopCode:
* 指定文字の含まれるページの先頭文字コードを返す
* 入力:d7.w=コード
* 出力:d7.w=ページ先頭文字コード
* 破壊:d7,d0
moveq.l #$20,d0 * 半角系
isHankaku @f
moveq.l #$40,d0 * 全角系
@@: and.l #$ff00,d7
move.b d0,d7
rts
*---------------------------------------
EndCode:
* 指定文字の含まれるページの最終文字コードを返す
* 入力:d7.w=コード
* 出力:d7.w=ページ最終文字コード
* 破壊:d7,d0
moveq.l #$df,d0 * 半角系
isHankaku @f
moveq.l #$fc,d0 * 全角系
@@: and.l #$ff00,d7
move.b d0,d7 * ここが.bなのでmoveq.lで>=$80を代入しても良い
rts
*------------------------------------------------------------------------------
AreaTop macro end,top
* 入力:d0.w:文字コード
* if (c>end && c<top) cd=top ; end<topのこと
local L1
cmp.w #end,d7
bls L1 * c<=end
* c>end
cmp.w #top,d7
bcc L1 * c>=top
* c<top = c>end && c<top
move.w #top,d7
rts
L1:
.endm
*---------------------------------------
CodePlus:
* 次のコードを返す
* 入力:d7.w = 現在のコード
* 出力:d7.w = 次のコード
* 破壊:d0
addq.w #1,d7 * cd++
AreaTop 0,HANTOP
AreaTop HANEND,HAN2TOP
AreaTop HAN2END,JISKTOP
AreaTop JISKEND,JIS1TOP
AreaTop JIS1END,JIS2TOP1
AreaTop JIS2END1,JIS2TOP2
AreaTop JIS2END2,JISGTOP
AreaTop JISGEND,HAN4TOP1
*
isHankaku 2f * 半角?
* 全角系
cmp.b #$7f,d7
bne @f
addq.w #1,d7 * if (cl==0x7f) cd++; // 存在しないコードを飛ばす
rts
*
@@: cmp.b #$fd,d7 * if (cl>=0xfd) cd=TopCode(cd+0x100); // 次ブロックの先頭
bcs @f * <$fd
1: add.w #$100,d7
bsr TopCode * d0破壊
@@: rts
*
2: * 半角系
cmp.b #$7f,d7 * if (cl==0x7f) cd+=0x21; // 存在しないコードを飛ばす
bne @f
add.w #$21,d7
rts
*
@@: cmp.b #$e0,d7 * if (cl>=0xe0) cd=TopCode(cd+0x100); // 次ブロックの先頭
bcc 1b * >=$e0
rts
*------------------------------------------------------------------------------
AreaEnd macro top,end
* 入力:d0.w:文字コード
* if (c>end && c<top) cd=end ; end<topのこと
local L1
cmp.w #end,d7
bls L1 * c<=end
* c>end
cmp.w #top,d7
bcc L1 * c>=top
* c<top = c>end && c<top
move.w #end,d7
rts
L1:
.endm
*---------------------------------------
CodeMinus:
* 前のコードを返す
* 入力:d7.w = 現在のコード
* 出力:d7.w = 前のコード
* 破壊:d0
subq.w #1,d7 * cd--
AreaEnd $ffff,HANGEND
AreaEnd HAN4TOP1,JISGEND
AreaEnd JISGTOP,JIS2END2
AreaEnd JIS2TOP2,JIS2END1
AreaEnd JIS2TOP1,JIS1END
AreaEnd JIS1TOP,JISKEND
AreaEnd JISKTOP,HAN2END
AreaEnd HAN2TOP,HANEND
*
isHankaku 2f * 半角?
* 全角系
cmp.b #$7f,d7
bne @f
subq.w #1,d7 * if (cl==0x7f) cd--; // 存在しないコードを飛ばす
rts
*
@@: cmp.b #$40,d7 * if (cl<0x40) cd=EndCode(cd-0x100); // 前ブロックの最後
bcc @f * >=$40
1: sub.w #$100,d7
bsr EndCode * d0破壊
@@: rts
*
2: * 半角系
cmp.b #$9f,d7 * if (cl==0x9f) cd-=0x21; // 存在しないコードを飛ばす
bne @f
sub.w #$21,d7
rts
*
@@: cmp.w #$20,d7 * if (cl<0x20) cd=EndCode(cd-0x100); // 前ブロックの最後
bcs 1b * <$20
rts
*------------------------------------------------------------------------------
B_PRINT_HEX4:
* d7.wを16進4桁で表示する
* 入力:d7.w
* 破壊:d0,d1,d2
move.w d7,d1
lsr.w #8,d1 * 上位8ビット
bsr B_PRINT_HEX2
move.w d7,d1 * 下位8ビット
B_PRINT_HEX2:
* codeを16進2桁で表示する
* 入力:d1.b
* 破壊:d0,d1,d2
move.b d1,d2 * 保存
lsr.w #4,d1 * 上位4ビット(本当は.bでいい)
bsr @f
*
move.b d2,d1
@@: and.b #$0f,d1
*
add.b #'0',d1
cmp.b #'9',d1 * '9'>?
bls @f * <='9' ($0~$9)
* $A~$F
add.b #'A'-10-'0',d1
@@: IOCS _B_PUTC
rts
*------------------------------------------------------------------------------
CmpSkip macro code
cmp.w #code,d5
bcs 1f
lea LenType(a1),a1 * 次の文字種へ;フラグは破壊しない
.endm
*---------------------------------------
CodeType:
* 文字種別を返す
* 入力:d5.w = ctop
* 出力:a1.l = 文字種類メッセージアドレス
lea TypeHan(opc),a1
*
CmpSkip HAN2TOP
CmpSkip JISKTOP
CmpSkip (JIS1TOP.and.$ff00).or.$40 * TopCode(JIS1TOP)相当
CmpSkip (JIS1END.and.$ff00).or.$40 * TopCode(JIS1END)相当
beq 1f
lea LenType(a1),a1
cmp.w #(JIS2END2.and.$ff00).or.$40,d5 * TopCode(JIS2END2)相当
bls 1f * <=
lea LenType(a1),a1
CmpSkip HAN4TOP1
CmpSkip HAN4TOP2
CmpSkip HANGTOP
1: rts
*------------------------------------------------------------------------------
Print1Page:
* 1ページ分の文字コード表を表示する
* 入力:d3.w=x
* d4.w=y
* d7.w=code
movem.l d3-d7,-(sp)
move.w d7,d5
bsr EndCode * cend(d7.w)=EndCode(d7.w)
exg d7,d5 * d7.w=cd , d5.w=cend
bsr TopCode * ctop(d7.w)=TopCode(d7.w)
cmp.w ctop0(opc),d7
beq 10f * ctop==ctop0 : ページ内移動のみ
* ページが変わる/強制再描画
move.w d7,ctop0 * ctop記録
*
* コード種類表示
addq.w #2,d3 * x+=2
move.w d3,d1
add.w #SCLEN/2+5,d1 * x+SCLEN/2+5
move.w d4,d2
subq.w #2,d2 * y-2
IOCS _B_LOCATE * (d1.w,d2.w)
bsr CodeType * a1.l <- (d5.w)
IOCS _B_PRINT
*
1: move.w d3,d1 * x
move.w d4,d2
addq.w #1,d4 * y++
IOCS _B_LOCATE * (d1.w,d2.w)
bsr B_PRINT_HEX4 * アドレス表示(d7.w)
lea Sep(opc),a1
IOCS _B_PRINT
moveq.l #16-1,d6
3: moveq.l #' ',d1
IOCS _B_PUTC
move.l d0,d2 * x0
*
bsr NoneCode * d0破壊
tst.l d0
beq 2f
lea None(opc),a1 * このコードには文字がない
IOCS _B_PRINT
bra @f
*
2: move.w d7,d1
IOCS _B_PUTC * B_PUTC()は2バイトコードok
swap d0 * x1
swap d2 * x0
sub.w d2,d0
cmp.w #1,d0
bne @f
moveq.l #' ',d1
IOCS _B_PUTC * 半角系文字のとき
@@: addq.w #1,d7 * cd++
dbra d6,3b
*
cmp.w d5,d7
bls 1b * cd<=cend
*
10: movem.l (sp)+,d3-d7
* ページ内での移動では再表示しない
* カーソル位置の文字コードを表示する V1.1
move.w d3,d1
add.w #SCLEN/2+6+11,d1
move.w d4,d2
subq.w #2,d2
IOCS _B_LOCATE * (d1.w,d2.w)
bsr B_PRINT_HEX4 * B_PRINT_HEX4(code); // S-JIS
move.l d7,-(sp)
moveq.l #'/',d1
IOCS _B_PUTC
move.w d7,d1 * S-JIS
IOCS _SFTJIS
tst.l d0
bmi @f * <0:JISコードが存在しない文字のときはS-JISそのまま
move.w d0,d7 * JISを表示のため
@@: bsr B_PRINT_HEX4 * B_PRINT_HEX4(jis); // JIS
move.l (sp)+,d7
* 現在のページ内でそのコードの存在位置にカーソルを移動する
move.w d7,d1 * code
sub.w ctop0(opc),d1 * code-=ctop0
move.w d1,d2
and.w #$000f,d1 * code%16
move.w d1,d0
add.w d1,d1 * *2
add.w d0,d1 * =*3
add.w #8+1,d1
add.w d3,d1 * +x
lsr.w #4,d2 * code/16
add.w d4,d2 * +y
IOCS _B_LOCATE * (d1.w,d2.w)
rts
*------------------------------------------------------------------------------
PrintCodes:
regs = 4*6 * d3-d7/a3
movem.l d3-d7/a3,-(sp)
move.w xx(opc),d3
move.w yy(opc),d4
lea cd(opc),a3
move.w (a3),d7 * cd(.w)
addq.w #1,d3 * x+1
addq.w #2,d4 * y+2
move.w #-1,ctop0 * ctop0=-1 for 強制再描画
moveq.l #CACI_NORMAL,d6 * ret
*
10: bsr Print1Page * 1ページ表示
*
* ASKに頼らずキー入力を行っている。一応可能なようである。
* 今回はどうしてもカーソル点滅をさせたいため、ASKからのキー入力が使えない。
*(独自にカーソルを作り出せばいいが面倒なので。)
IOCS _OS_CURON * カーソルon
moveq.l #$0e,d1
IOCS _BITSNS * シフト系キーが押されているか
move.b d0,d2 * sft
swap d2 * d2.h.w
IOCS _B_KEYINP
and.w #$ff00,d0
move.w d0,d2
IOCS _OS_CUROF * カーソルoff
moveq.l #0,d5 * skip=0
lea Jtable(opc),a0
bsr SearchKeyJ * key jump
* <- ここに戻ってくる
cmp.w #SKesc0,d2
bne 10b
*
move.w d7,(a3) * cd=c
move.w d6,d0 * ret
movem.l (sp)+,d3-d7/a3
rts
*---------------------------------------
SearchKeyJ:
* キーサーチ&ジャンプ
* d2.w <- code
* a0 <- jump table
* 少なくともd0/d1/a0破壊
@@: move.l (a0)+,d0 * jump|code
beq @f * -> end of table
cmp.w d2,d0 * =code?
bne @b * no
swap d0 * d0=jump
jmp -4(a0,d0.w) * 飛び先からrtsする
*
@@: rts * default
*---------------------------------------
Jtable: * 各キー毎のジャンプテーブル(出てきやすい順に並べる)
* jump先(offset),code
.dc.w Jleft-$,SKleft
.dc.w Jright-$,SKright
.dc.w Jrdown-$,SKrdown
.dc.w Jup-$,SKup
.dc.w Jrup-$,SKrup
.dc.w Jdown-$,SKdown
.dc.w Jhome-$,SKhome
.dc.w Jdel-$,SKdel
*
.dc.w Jf1-$,SKf1
.dc.w Jf1-$,SKt10
.dc.w Jf1-$,SKm1
.dc.w Jf2-$,SKf2
.dc.w Jf2-$,SKt20
.dc.w Jf2-$,SKm2
.dc.w Jf3-$,SKf3
.dc.w Jf3-$,SKt30
.dc.w Jf3-$,SKm3
.dc.w Jf4-$,SKf4
.dc.w Jf4-$,SKt40
.dc.w Jf4-$,SKm4
.dc.w Jf5-$,SKf5
.dc.w Jf5-$,SKt50
.dc.w Jf5-$,SKm5
.dc.w Jf6-$,SKf6
.dc.w Jf6-$,SKt60
.dc.w Jf6-$,SKm6
.dc.w Jf10-$,SKf10
.dc.w Jf10-$,SKt00
.dc.w Jf10-$,SKm0
*
.dc.w Jbs-$,SKbs0
.dc.w Jclr-$,SKclr
.dc.w Jcr-$,SKcr0
.dc.w Jcr-$,SKent0
.dc.w Jspc-$,SKspc0
.dc.w Jkigou-$,SKkigo
.dc.w Jesc-$,SKesc0
*
.dc.w 0,0 * end of table
*---------------------------------------
Jleft: * 前
cmp.w #HANTOP,d7
bls @f
bsr CodeMinus * d7
@@: rts
Jright: * 次
cmp.w #HANGEND,d7
bcc @f
bsr CodePlus * d7
@@: rts
*---------------------------------------
Jrdown: * 前ページ
cmp.w #HANEND,d7 * すでに$00xxを表示している時は前ページ無し
bls 1f * C版はintなので不要だが、.s版は.wなので必要
move.w #$100-$10,d5
Jup: * 前行
add.w #$10,d5
move.w d7,d0 * c
sub.w d5,d0 * c-skip
cmp.w #HANTOP,d0
bcs 1f * if (c-skip<HANTOP) break;
sub.w d5,d7 * c-=skip;
@@: move.w d7,d0 * c
sub.w #$10,d0 * c-$10
cmp.w #HANTOP,d0
bls 1f * if (c-$10<=HANTOP) break;
bsr NoneCode
tst.l d0
beq 1f
sub.w #$10,d7
bra @b
*
1: rts
*
Jrup: * 次ページ
move.w #$100-$10,d5
Jdown: * 次行
add.w #$10,d5
move.w d7,d0 * c
add.w d5,d0 * c+skip
cmp.w #HANGEND,d0
bhi 1f * if (c+skip>HANGEND) break;
add.w d5,d7 * c+=skip;
@@: move.w d7,d0 * c
add.w #$10,d0 * c+$10
cmp.w #HANGEND,d0
bcc 1f * if (c+$10>=HANGEND) break;
bsr NoneCode
tst.l d0
beq 1f
add.w #$10,d7
bra @b
*
1: rts
*---------------------------------------
Jhome: * ページ先頭
bsr TopCode
cmp.w #HANTOP,d7
bcc @f * >
move.w #HANTOP,d7
@@: rts
*
Jdel: * ページ最終
bsr EndCode
cmp.w #HANGEND,d7
bls @f * <=
move.w #HANGEND,d7
@@: rts
*---------------------------------------
Jf1: * 第1水準漢字へ飛ぶ
move.l #JIS1TOP<<16|JIS1END,d1
bra f00
*
Jf2: * 第2水準漢字へ飛ぶ
move.l #JIS2TOP1<<16|JIS2END2,d1
bra f00
*
Jf3: * 1/2角文字へ飛ぶ
move.l #HAN2TOP<<16|HAN2END,d1
bra f00
*
Jf4: * 1/4角文字へ飛ぶ
move.l #HAN4TOP1<<16|HAN4END2,d1
bra f00
*
Jf5: * 記号へ飛ぶ
move.l #JISKTOP<<16|JISKEND,d1
bra f00
*
Jf6: * 外字へ飛ぶ
move.l #JISGTOP<<16|JISGEND,d1
bra f00
*
Jf10: * 半角文字へ飛ぶ
move.l #HANTOP<<16|HANEND,d1
f00: move.l d2,d0
swap d0 * d2.h.w -> d0.l.w (.b=sft)
and.w #SKsft|SKopt1,d0
beq @f
move.w d1,d7 * end
rts
*
@@: swap d1
move.w d1,d7 * top
rts
*---------------------------------------
Jbs: * 入力ライン1文字消し
move.w pt(opc),d0
beq BEEP * pt=0:入力無し
* pt>0
subq.w #1,d0 * pt--
move.w d0,pt
lea pts(opc),a0
moveq.l #0,d1 * for .b = .w
move.b (a0,d0.w),d1 * pts[pt]
sub.w d1,ptb * ptb-=pts[pt];
move.w ptb(opc),d0
lea cbuf(opc),a0
clr.b (a0,d0.w) * cbuf[ptb]=0;
bra COUT
*
BEEP: moveq.l #7,d1
IOCS _B_PUTC * BEEP
rts
*
Jclr: * 入力ライン消し
clr.b cbuf * cbuf[0]=0
clr.w pt
clr.w ptb
bra COUT
*---------------------------------------
Jcr: * コードを返す
move.b #1,first
tst.w pt
beq Jspc
* pt>0
move.w #DF_OUTSTR|CACI_END,d6 * 文字列出力
move.w #SKesc0,d2
rts
*
* pt=0のときは現在カーソル位置の1文字を持ってリターン
Jspc: * 1文字選択
moveq.l #1,d1
cmp.w #$ff,d7 * cs=1+(c>0xff); // 今ストアする文字のバイト数
bls @f
addq.w #1,d1
@@: * 今のコードは入る?
move.w d1,d0
add.w ptb(opc),d0 * cs+ptb
addq.w #1,d0 * +1
cmp.w #C_SIZE-1,d0
bcc BEEP * if (ptb+cs+1>=C_SIZE-1) バッファーオーバー
* 今のコードを入れる
lea pts(opc),a0
move.w pt(opc),d0
move.b d1,(a0,d0.w) * pts[pt++]=cs;
addq.w #1,d0
move.w d0,pt
*
move.w ptb(opc),d0
lea cbuf(opc),a0
lea (a0,d0.w),a0 * cbuf[ptb]
cmp.b #2,d1 * cs==2?
bne @f * No = 1バイト文字
move.w d7,d1
lsr.w #8,d1
move.b d1,(a0)+ * if (cs==2) cbuf[ptb++]=(unchar)(c>>8);
addq.w #1,d0
@@: move.b d7,(a0)+ * cbuf[ptb]=(unchar)c;
addq.w #1,d0 * ptb++
clr.b (a0)+ * cbuf[ptb]=0; // EOS
move.w d0,ptb
cmp.w #HANGEND,d7 * if (c<HANGEND) c=CodePlus(c); // コードを+1する
bcc COUT * >=
bsr CodePlus * d7
COUT: * ASKに戻して表示させる処理
cmp.w #SKcr0,d2
beq @f
cmp.w #SKent0,d2
bne 1f
@@: * すでにcbufに入っているものを返すだけ
move.w #DF_OUTSTR|CACI_END,d6 * CR/ENTERのときは終了
move.w #SKesc0,d2 * first=1は代入済み
rts
*
1: move.w #DF_KWINSTR|CACI_URGENT,d6 * 直ぐに戻ってこさせるため
bsr BREAKOFF
lea cbuf(opc),a0
move.l #kbuf,d0
moveq.l #0,d1
bsr Str2MEANS * kbuf[Str2MEAN(cbuf,kbuf,0)] = 0;
move.w #SKesc0,d2
BREAKON: * ここはサブルーチンでもある
* d0のみ破壊
move.w brksts(opc),-(sp)
DOS _BREAKCK
addq.w #2,sp
rts
*---------------------------------------
Jkigou: move.w #SKesc0,d2
Jesc: move.w #CACI_END,d6
move.b #1,first
rts
*---------------------------------------
Str2MEANS:
* buf[Str2MEAN(mes,buf,mode)]=0
* a0 <- mes
* d0.l <- buf
* d1.l <- mode (0=通常表示,1=反転表示)
move.l d1,-(sp) * mode
move.l d0,-(sp) * buf
pea (a0) * mes
pea 62.w
DOS _KNJCTRL
lea 4*4(sp),sp
move.l -8(sp),a0 * buf
add.w d0,d0 * .w=MEAN
clr.w (a0,d0.w) * buf[..]=0
rts
*------------------------------------------------------------------------------
waku2:
* void waku2(short sx,short sy, short wx, short wy,short plane)
* 枠描画2 4 8 12 16 20
regs = 4*4 * d3-d6
movem.l d3-d6,-(sp) * 4*4
lea Twork(opc),a1
move.w 20+2+regs(sp),d2 * plane
moveq.l #0,d0 * for .b = .w
move.b d2,d0 * plane&0xff
move.w d0,(a1) * plane
move.w 4+2+regs(sp),d3 * sx
move.w 8+2+regs(sp),d4 * sy
move.w 12+2+regs(sp),d5 * wx
move.w 16+2+regs(sp),d6 * wy
move.w #$ffff,10(a1) * line style
* メイン枠
movem.w d3-d6,2(a1)
*move.w d3,2(a1) * sx
*move.w d4,4(a1) * sy
*move.w d5,6(a1) * wx
*move.w d6,8(a1) * wy
IOCS _TXBOX
lsr.w #8,d2 * f=(plane>>8) ; 影付き枠線モード
moveq.l #2,d2
* 影1 : tl.x=sx+8; tl.y=sy+wy-1+f; tl.x1=wx-8+f; tl.y1=1;
addq.w #8,2(a1) * x=sx+8
*
move.w d6,d1 * wy
subq.w #1,d1 * -1
add.w d2,d1 * +f
add.w d1,4(a1) * +sy=y
*
subq.w #8,6(a1) * wx-8
add.w d2,6(a1) * +f=x1
*
move.w #1,8(a1) * y1=1
IOCS _TXLINE
*
* 影2 : tl.x=sx+wx-1+f; tl.y=sy+8; tl.x1=1; tl.y1=wy-8+f-1;
add.w d5,d3 * sx+wx
subq.w #1,d3 * -1
add.w d2,d3 * +f
move.w d3,2(a1) * =x
*
addq.w #8,d4 * sy+8
move.w d4,4(a1) * =y
*
move.w #1,6(a1) * x1
*
subq.w #8,d6 * wy-8
add.w d2,d6 * +f
subq.w #1,d6 * -1
move.w d6,8(a1) * =y1
IOCS _TXLINE
movem.l (sp)+,d3-d6
rts
*------------------------------------------------------------------------------
SetXYs:
* d0.w = x/y座標(in:現在のカーソル座標,out:表示座標)
* d3.w = CDW?
* d4.w = CSR?MAX
addq.w #1,d0 * +1座標から
move.w d0,d1 * xy
add.w d3,d1
addq.w #1,d1 * xy+(CDW-1)
move.w d4,d2 * w=テキストx/y幅-1
cmp.w d2,d1 * xy+CDW-1>w?
bls @f * <= ; 入りきる
* 入りきらない時
subq.w #1,d0 * xy-1
sub.w d3,d0 * xy-1>CDW? -> xy-1-CDW>0?
bgt @f * Yes * V1.2のバグはここ。bhiになってた。
move.w d2,d0 * w
sub.w d3,d0 * xy=w-CDW+1;
addq.w #1,d0 * -(CDW-1)
@@:
rts
First2:
movem.l d3-d6,-(sp)
IOCS _OS_CUROF * カーソルoff(waku2/画面退避にて重要)
* 表示座標設定
move.l xy(opc),d0 * h.w=x
swap d0 * (xy>>16)
move.w #CDWX,d3
move.w CSRXMAX.w,d4 * IOCSワークエリア
cmp.w #96,d4 * ED.R対応
blt 30f * wx<96
moveq.l #95,d4 * wx>=96 -> wx=95
30: bsr SetXYs * 表示x座標設定
*
move.w d0,xx * =xx
move.l xy(opc),d0 * l.w=y
move.w #CDWY,d3
move.w CSRYMAX.w,d4 * IOCSワークエリア
bsr SetXYs * 表示y座標設定
move.w d0,yy * =yy
* 下画面保存
moveq.l #_TEXTGET,d3
bsr TextGetPut
* 画面下消去
move.w xx(opc),d3
move.w yy(opc),d4
move.w d4,d2 * yy
moveq.l #CDWY-1,d6 * -1 for dbra
2: move.w d3,d1 * xx
IOCS _B_LOCATE * B_LOCATE(xx,y);
moveq.l #CDWX-1,d5 * -1 for dbra
move.w #' ',d1
@@: IOCS _B_PUTC
dbra d5,@b
addq.w #1,d2 * y++
dbra d6,2b
*
pea $0201.w * plane
pea (CDWY*16-16).w
pea (CDWX*8-8).w
move.w d4,d0 * yy
add.w oy(opc),d0 * +B_CONSOL y-offset
lsl.w #4,d0 * *16
addq.w #8,d0 * +8
move.l d0,-(sp)
move.w d3,d0 * xx
add.w ox(opc),d0 * +B_CONSOL x-offset
lsl.w #3,d0 * *8
addq.w #4,d0 * +4
move.l d0,-(sp)
bsr waku2 * waku2(xx*8+4,yy*16+8,CDWX*8-8,CDWY*16-16,0x201);
lea 5*4(sp),sp
*
* タイトル、キー操作など表示(SCLEN以下のこと)
move.w d3,d1 * xx
addq.w #2,d1 * xx+2
move.w d4,d2 * yy
IOCS _B_LOCATE
lea Hyou(opc),a1
IOCS _B_PRINT * B_XYPRINT(xx+2,yy,"[ 文字コード表 ]");
*
subq.w #1,d1 * xx=xx+2-1=xx+1
addq.w #1,d2 * yy+1
IOCS _B_LOCATE
lea Scale(opc),a1
IOCS _B_PRINT * B_XYPRINT(xx+1,yy+1,SCALE);
add.w #CDWY-3-1,d2 * yy+1+CDWY-3-1
IOCS _B_LOCATE
lea Scale(opc),a1
IOCS _B_PRINT * B_XYPRINT(xx+1,yy+CDWY-3,SCALE);
*
move.w #TCYAN|REVERSE,d1
IOCS _B_COLOR
move.w d3,d1 * xx
addq.w #1,d1 * xx+1
addq.w #1,d2 * 下のScaleの1つ下
IOCS _B_LOCATE
lea Keys(opc),a1
IOCS _B_PRINT * B_XYPRINT(xx+1,yy+CDWY-3+1,Keys);
move.w #TWHITE,d1
IOCS _B_COLOR
*
move.w d3,d1 * xx
add.w #3+SCLEN/2+4,d1
move.w d4,d2 * yy
IOCS _B_LOCATE
lea WShurui(opc),a1
IOCS _B_PRINT * B_XYPRINT(xx+3+SCLEN/2+4,yy,コード種類表示枠);
*
clr.b cbuf * cbuf[0]=0
clr.w pt
clr.w ptb
clr.b first * first=0
movem.l (sp)+,d3-d6
rts
*---------------------------------------
Codes:
* short Codes(BIT16K key)
* keyは使っていない
cmp.b #1,first
bne 2f
* "文字選択"の表示のためだけに一度リターン
move.b #2,first
*
clr.l vecTimerC * ベクターを止めてないの印
tst.b ftimerc
beq @f * -> Timer-Cはそのまま
* Timer-Cのベクターを保存する
move.w #TimerC,-(sp)
DOS _INTVCG
addq.l #2,sp
cmp.l vecTimerC0(pc),d0 * 組み込み時と違う?
beq @f * 同じ=書き変わってないので止めない
* 書き変わっているので止める
move.l d0,vecTimerC
* Timer-Cの割り込みを無効にする
pea Ret(pc)
move.w #TimerC,-(sp)
DOS _INTVCS
addq.l #6,sp
*
@@: move.b CURMODE.w,cur * カーソル表示スイッチ記録(<>0で表示)
move.l CURSOR.w,xy * カーソル座標記録
* B_CONSOLのオフセットからテキストレベルのオフセットを計算する
move.l MTXOFST.w,d0
move.w d0,d1
and.w #$7f,d1 * tx (ad%128)
move.w d1,ox
lsr.l #8,d0
lsr.l #3,d0 * 上位ビットの0も兼ねてるので、swap+lsl.l #5にしないこと
move.w d0,oy * ty (ad/128/16)
*
moveq.l #'0',d1
bsr Condrv * condrv off
*
bsr BREAKOFF
lea MesTitle(opc),a0
move.l #mbuf,d0
moveq.l #1,d1 * 反転表示
bsr Str2MEANS * Str2MEAN("文字選択", mbuf, 1);
bsr BREAKON
move.w #DF_MWINSTR|CACI_URGENT,d0 * 直ぐ戻ってくる
rts
*
2: cmp.b #2,first
bne @f
bsr First2
*
@@: * コード表表示&選択
bsr PrintCodes
*
cmp.b #1,first
bne 1f
move.l d0,-(sp) * push d0
*
moveq.l #'1',d1
bsr Condrv * condrv on
* 画面復帰
moveq.l #_TEXTPUT,d3
bsr TextGetPut
* カーソル座標復帰
move.l xy(opc),CURSOR.w
* カーソル表示復帰
moveq.l #_OS_CURON,d0 * cur<>0
tst.b cur
bne @f
moveq.l #_OS_CUROF,d0 * cur=0
@@: trap #15
* このカーソル座標復帰と点滅復帰の順を逆にするとカーソルが残ってしまう
move.l vecTimerC(pc),d0 * Timer-Cは止められてる?
beq @f * -> 止めてない
* Timer-Cのベクターを復帰する
move.l d0,-(sp)
move.w #TimerC,-(sp)
DOS _INTVCS
addq.l #6,sp
*
@@: move.l (sp)+,d0 * pop d0
1: rts
Ret: * <- Timer-Cの飛び先
rte * 何もしない
*---------------------------------------
Condrv:
* 入力 : d1.w == '0' : OFF
* == '1' : ON
move.l $40c.w,a0 * KEY_INITのベクター
cmp.l #'hmk*',-4(a0)
bne @f * なし
* condrv.sysあり
* condrvのシステムコールによる制御がなぜかうまくいかないのでESC0/1で制御する。
* たぶん、KeyWitchの問題だと思う(99/08/29)。
* 修正版KeyWitchを使えばいいんだけど、直すのも面倒なのでこのまま。
move.w d1,-(sp)
moveq.l #$1b,d1 * ESC
IOCS _B_PUTC
move.w (sp)+,d1 * '0'/'1'
IOCS _B_PUTC
@@: rts
*---------------------------------------
TextGetPut:
* 下画面の保存/復帰
* d3=_TEXTGET/_TEXTPUT
moveq.l #BIT1,d1
IOCS _TCOLOR
move.l plane1(opc),a1
bsr @f * plane 1
*
moveq.l #BIT0,d1
IOCS _TCOLOR
move.l plane0(opc),a1
@@: move.w #CDWX*8,(a1) * xl
move.w #CDWY*16,2(a1) * yl
move.w xx(opc),d1
add.w ox(opc),d1 * B_CONSOL x-offset
lsl.w #3,d1 * 8
move.w yy(opc),d2
add.w oy(opc),d2 * B_CONSOL y-offset
lsl.w #4,d2 * 16
move.l d3,d0
trap #15
rts
*******************************************************************************
* ワーク2
*******************************************************************************
* ここに置くワークは、常駐後に使われるもの
* これらのワークエリアは常駐後に利用可能になるので、
* 以下の非常駐ルーチンからは参照しないこと
*------------------------------------------------------------------------------
* オフセットテーブルの定義
.offset 0
*---------------------------------------
* 状態変数
_brksts .ds.w 1 * BREAK状態
*---------------------------------------
* 変数
_pt .ds.w 1 * cbuf[]への今回のストア;文字数目
_ptb .ds.w 1 * cbuf[]への今回のストア;バイト位置
_pts .ds.b C_SIZE * cbuf[]への全ストアポイント(文字毎)
.even
_vecTimerC .ds.l 1 * 元TimerCベクター
_xy .ds.l 1 * 元カーソル座標x,y
_xx .ds.w 1 * 表示x座標
_yy .ds.w 1 * 表示y座標
_ox .ds.w 1 * B_CONSOL x-offset
_oy .ds.w 1 * B_CONSOL y-offset
_cur .ds.b 1 * カーソル点滅状態
.even
_Twork: * kbufを使う(K_SIZE>2*6なので大丈夫)
*---------------------------------------
* アクセサリバッファー
_kbuf .ds.w K_SIZE * 変換ラインへ
_mbuf .ds.w M_SIZE * モード表示領域へ
_cbuf .ds.b C_SIZE * 仮入力行 -> 入力行へ(ユーザーの入力へ)
*---------------------------------------
_keep_end1: * 常駐部分最後(通常時)
*---------------------------------------
* 下画面退避バッファー;/Mの時のみ確保される
.even
_plane00:
.ds.w 1 * WORD xl;
.ds.w 1 * WORD yl;
.ds.b CDWX*CDWY*16 * UBYTE buffer[CDWX*CDWY*16];
_plane10:
.ds.w 1 * WORD xl;
.ds.w 1 * WORD yl;
.ds.b CDWX*CDWY*16 * UBYTE buffer[CDWX*CDWY*16];
*---------------------------------------
_keep_end2: * 常駐部分最後(fget=0時)
*------------------------------------------------------------------------------
* 実際のワークエリアの定義
*------------------------------------------------------------------------------
.text * .offset解除
work2:
* 状態変数
brksts equ work2+_brksts
* 変数
pt equ work2+_pt
ptb equ work2+_ptb
pts equ work2+_pts
vecTimerC equ work2+_vecTimerC
xy equ work2+_xy
xx equ work2+_xx
yy equ work2+_yy
ox equ work2+_ox
oy equ work2+_oy
cur equ work2+_cur
Twork equ work2+_Twork
* アクセサリバッファー
kbuf equ work2+_kbuf
mbuf equ work2+_mbuf
cbuf equ work2+_cbuf
keep_end1 equ work2+_keep_end1 * 常駐部分最後(通常時)
* 下画面退避バッファー;/Mの時のみ確保される
plane00 equ work2+_plane00
plane10 equ work2+_plane10
keep_end2 equ work2+_keep_end2 * 常駐部分最後(/M時)
*******************************************************************************
* 非常駐ルーチン
*******************************************************************************
* アクセサリ定義構造体
*******************************************************************************
.even
ACdef .dc.w KS_EDIT0 * いつ呼び出されるか +0
.dc.w SHIFT_ON|NOT_ASCII|KIGOU_KEY * 呼びだしキー +2
* -KではSHIFT_ON不要
.dc.l Codes * アクセサリーメイン
* ASK <-> アクセサリ文字列受け渡し
.dc.l cbuf
.dc.l kbuf
.dc.l mbuf
*
*******************************************************************************
* アクセサリ 組み込み/解除/初期化
*******************************************************************************
DeleteAcc:
* 入力:a2 = ACh
* 出力:d0.l = 0:ok , !=0:エラー
* 破壊:d0
move.l a0,-(sp) * push a0
lea MesCodes(pc),a0
bsr Print
move.l (a2),-(sp) * ACh
pea 61.w
DOS _KNJCTRL
addq.l #4*2,sp
lea MesDeleteOk(pc),a0 * ok message
tst.l d0
beq @f * ret=0:Ok
lea ErrCantDelete(pc),a0 * error
@@: bsr Print
move.l (sp)+,a0 * pop a0
rts
*******************************************************************************
AttachAcc:
* アクセサリの登録
* 入力:なし
* 出力:d0.l = 0:ok , !=0:エラー
* 破壊:d0,d1,a0
* ASKのバージョンチェック
pea 50.w
DOS _KNJCTRL
addq.l #4,sp
cmp.l #300,d0 * <300? (V3.00未満?)
bcc @f * No (V3.00以降)
* ASK V3.00以降でない
lea ErrASK3(pc),a0
moveq.l #3,d0 * return(3)
bra 1f
*
@@: * アクセサリの登録
lea MesCodes(pc),a0
bsr Print
pea ACdef(pc)
pea 60.w
DOS _KNJCTRL
addq.l #4*2,sp
cmp.l #-1,d0 * error?
bne @f * no
* アクセサリに登録出来ない
lea ErrCantAttach(pc),a0
moveq.l #4,d0 * return(4)
bra 1f
*
@@: move.l d0,ACh * ACh=ret;
lea MesAttachOk(pc),a0
moveq.l #0,d0 * return(0)
1: bsr Print
rts
******************************************************************************
EPrint:
* エラー出力に表示する
* 表示は全てこれで行っている
* 入力:a0 = 文字列
* 破壊:なし
move.l d0,-(sp) * push d0
move.w #2,-(sp) * STDERR
pea (a0) * 文字列
DOS _FPUTS * エラー出力へ
addq.l #2+4,sp
move.l (sp)+,d0 * pop d0
rts
Print:
* 標準出力に表示する(リダイレクト可)
* 入力:a0 = 文字列
* 破壊:なし
move.l d0,-(sp) * push d0
pea (a0) * 文字列
DOS _PRINT
addq.l #4,sp
move.l (sp)+,d0 * pop d0
rts
******************************************************************************
* この中ではa0/a2は壊さないこと(プロセス管理ポインタ/コマンドラインを参照するため)
AMAX equ 10 * 最大引数数
* コマンドライン
* a2
* 0(a2) = コマンドライン長
* 1(a2)~ = コマンドライン
* '-r ',0 スペース/タブはそのまま
*
GetArgv:
* コマンドラインを解析して各要素の先頭アドレスをargvに、個数をargcに格納する
* 引数:a2 = コマンドライン
* 出力:d0.w = 引数数(=argc)
* 破壊:d0-d1
movem.l a2/a6,-(sp)
moveq.l #0,d1 * 引数の数
tst.b (a2)+ * コマンドライン長を飛ばす
beq 2f * コマンドライン長=0 -> 引数なし
lea argv(pc),a6
@@: * SPC/TAB skip
move.b (a2)+,d0
beq 2f * コマンドライン終わり
cmp.b #SPC,d0 * skip SPC
beq @b
cmp.b #TAB,d0 * skip TAB
beq @b
* SPC/TAB以外の文字が有った
subq.l #1,a2
move.l a2,(a6)+ * argv記録
addq.w #1,d1 * 引数+1
cmp.w #AMAX,d1 * 最大数を越える?
bcc 2f * -> 越える
1: * 次のEOS/SPC/TABまで飛ばす
move.b (a2)+,d0
beq 2f * コマンドライン終わり
cmp.b #SPC,d0 * skip SPC
beq @b
cmp.b #TAB,d0 * skip TAB
bne 1b
bra @b
*
2: move.w d1,argc * 記録
move.w d1,d0
movem.l (sp)+,a2/a6
rts
*---------------------------------------------
CheckOption:
* コマンドラインから指定オプションを探す
* 必ずGetArgvを呼び出した後に使うこと
* オプション名は先頭1文字だけで判別
* 引数:d2.b = オプション名(英小文字1文字)
* 出力:d0.l = 0:なし , !=0:そのオプションの次のアドレス
* 破壊:d0-d1
movem.l a5-a6,-(sp)
move.w argc(pc),d1
beq 1f * 引数はない
subq.w #1,d1 * -1 for dbra
lea argv(pc),a6
@@: move.l (a6)+,a5 * argv[i]
move.b (a5)+,d0 * argv[i][0]
* オプションの1文字目は'/''-'
cmp.b #'/',d0
beq 2f
cmp.b #'-',d0
beq 2f
3: dbra d1,@b * 次へ
1: * (指定)オプションはない
moveq.l #0,d0
bra 4f
2: * '/''-'があった
move.b (a5)+,d0 * 次の1文字
or.b #$20,d0 * 英小文字化
cmp.b d2,d0 * 一致?
bne 3b * -> 不一致
move.l a5,d0 * オプション名の次のアドレス(!=0)
4: movem.l (sp)+,a5-a6
rts
******************************************************************************
* メイン
******************************************************************************
.xref keepchk
.if EX68
.xref _ChkEX68
.endif
main:
lea.l initsp(pc),sp * PROGRAM=の時のため
* タイトル表示
move.w #2,-(sp) * STDERR
pea title(pc) * 文字列
DOS _FPUTS * エラー出力へ
addq.l #2+4,sp
*
.if EX68
jbsr _ChkEX68 * EX68のチェック
bne Err_EX68 * 動作不可とする(将来外す可能性はある)
.endif
*
move.l #(id-KEEP_START),-(sp) * 識別子の相対位置
pea.l (a0) * 自分のメモリ管理ポインタ
bsr keepchk * 常駐チェック
addq.l #4*2,sp
move.b d0,d7 * d7 :0=常駐してない , -1=常駐している
* 引数チェック1
bsr GetArgv * argc/argv設定
moveq.l #'r',d2 * -r : 常駐解除?
bsr CheckOption
tst.l d0
beq keep * no
*
* 常駐解除
*
tst.b d7 * 常駐している?
beq Err_NoKp * No -> error
* a0=常駐しているルーチンのメモリ管理ポインタ
* メモリー管理ポインタを飛ばし、ユーザープログラム先頭へ
* さらに、AChまで飛ばす
lea.l ACh-KEEP_START+PSPSIZ(a0),a2 * AChのアドレス
bsr DeleteAcc * アクセサリ解除
tst.l d0
bne Err_Kai * アクセサリ登録削除不可により常駐解除不可
*
pea.l MPSIZ(a0)
DOS _MFREE * 自己プロセスメモリー解放
addq.l #4,sp
tst.l d0
bmi Err_Kai * なぜかメモリー解放出来ない時
*
* 常駐解除正常終了
lea MesRelease(pc),a0
bsr Print
clr.w -(sp) * exit(0)
DOS _EXIT2
keep: * 常駐
tst.b d7 * 常駐している?
bne Err_Dbl * Yes -> error(2重常駐)
*
moveq.l #'c',d2 * -c : 起動時にTimer-Cを止める
bsr CheckOption
move.b d0,ftimerc
* Timer-Cのベクターを保存する
move.w #TimerC,-(sp)
DOS _INTVCG
addq.l #2,sp
move.l d0,vecTimerC0 * 組み込み時のTimer-C
*
* 画面退避アドレス設定
moveq.l #'m',d2 * -m : メインメモリに画面退避バッファー確保
bsr CheckOption
lea plane00(opc),a0 * メインメモリ
lea plane10(opc),a1
move.l #keep_end2-KEEP_START,d7 * 常駐サイズ
tst.l d0
bne @f * -mあり
move.l #$e50000,a0 * テキスト未使用領域
move.l #$e50000+2*2+CDWX*CDWY*16,a1
move.l #keep_end1-KEEP_START,d7 * 常駐サイズ
@@: move.l a0,plane0
move.l a1,plane1
*
* 起動キーを変える?(V1.1)
moveq.l #'k',d2 * -k : 起動キーを[記号入力]のみにする
bsr CheckOption
tst.l d0
beq @f * -kなし
move.w #NOT_ASCII|KIGOU_KEY,ACdef+2
*
@@: * アクセサリ組み込み
bsr AttachAcc
tst.l d0
bne Err_Keep * 組み込みエラー
*
* アクセサリも組み込みOK
lea MesKeep(pc),a0
bsr Print
clr.w -(sp) * exit(0)相当
move.l d7,-(sp) * 常駐サイズ
DOS _KEEPPR
*
* エラー終了
*
.if EX68
Err_EX68: * EX68上である
lea.l ErrEX68(pc),a0
bra.s error
.endif
Err_NoKp: * 常駐していないのに解除しようとした
lea.l NoKeep(pc),a0
bra.s error
Err_Dbl: * 2重常駐
lea.l AlreadyKeep(pc),a0
bra.s error
Err_Keep: * 常駐できない
lea.l CantKeep(pc),a0
bra.s error
Err_Kai: * 常駐解除不可
lea.l CantRelease(pc),a0
bra.s error
usage: * 使用法
lea.l MesUsage(pc),a0
error: bsr EPrint * エラー出力へ表示
erRet: move.w #2,-(sp) * exit(2)
DOS _EXIT2
******************************************************************************
* メッセージなど
******************************************************************************
.even
MesCodes: .dc.b 'アクセサリ「文字選択」',0
MesDeleteOk: .dc.b 'を削除しました',$0d,$0a,0
ErrCantDelete: .dc.b 'が削除できません',$0d,$0a,0
ErrCantAttach: .dc.b 'が登録できません',$0d,$0a,0
MesAttachOk: .dc.b 'を登録しました',$0d,$0a,0
ErrASK3: .dc.b 'ASK v3/codeAではありません',$0d,$0a,0
title: .dc.b 'ASK3/codeAアクセサリ ASKCodes V1.31',$0d,$0a
.dc.b $09,'Copyright 1998-99 by AIG-Soft' * CrLfにつながる
CrLf .dc.b $0d,$0a
Eoss .dc.b 0
MesKeep: .dc.b '常駐しました',$0d,$0a,0
MesRelease: .dc.b '常駐解除しました',$0d,$0a,0
NoKeep: .dc.b '常駐していません',$0d,$0a,0
AlreadyKeep: .dc.b 'すでに常駐しています',$0d,$0a,0
CantKeep: .dc.b '常駐できません',$0d,$0a,0
CantRelease: .dc.b '常駐解除できません',$0d,$0a,0
.if EX68
ErrEX68 .dc.b 'EX68上では組み込めません',$0d,$0a,0
.endif
MesUsage: .dc.b 'ASKCodes [/R /M /K /C]',$0d,$0a,0
.even
argc .ds.w 1 * 引数の個数
argv .ds.l AMAX * 各引数の先頭アドレス
******************************************************************************
* 非常駐ルーチンが使うスタック
******************************************************************************
.stack
.even
.ds.l 512
initsp:
******************************************************************************
.end main